//
// Created by Zeppyrz on 2025/11/5.
//

#ifndef ZEDISK_COMMONTASK_H
#define ZEDISK_COMMONTASK_H

#include <string>

#include "Message.h"
#include "Task.h"

// forward declaration
struct bufferevent;

namespace ZeDisk {

class DECLSPEC CommonTask : public Task {
 public:
  CommonTask() = default;
  ~CommonTask() override = default;

  bool Init() override;
  bool Stop() override;

  virtual void ReadCallback();
  virtual void BeginWrite();
  virtual void WriteCallback();
  /**
   * @brief 客户端连接成功回调
   *
   * @param what 发生的事件
   */
  virtual void EventCallback(short what);
  /**
   * @brief 客户端成功连接服务端时的回调
   */
  virtual void ConnectCallback();
  // 处理消息 由业务重载
  virtual void HandleMessage(const Message* msg);
  // 关闭接受Message时，将接受原始数据（文件处理）
  virtual void HandleRawMessage(void* data, int size);
  // 将消息头写入bev
  virtual bool WriteMessage(const Message* msg);
  virtual bool WriteRawMessage(const void* data, int size);

  [[nodiscard]] std::string& server_ip() { return server_ip_; }
  [[nodiscard]] int& port() { return port_; }
  [[nodiscard]] bufferevent*& bev() { return bev_; }
  [[nodiscard]] bool& is_recv_msg() { return is_recv_msg_; }

protected:
  char read_buffer_[1024] = {0};

 private:
  std::string server_ip_;
  int port_ = -1;
  bufferevent* bev_ = nullptr;
  Message msg_;
  bool is_recv_msg_ = true;

};

}  // namespace ZeDisk

#endif  // ZEDISK_COMMONTASK_H
